function compilePath(path) {
  let paramNames = [] // 路径参数名的数组
  let regexpSource = `^` + path.replace(/:(\w+)/g, (_, group1) => {
    // console.log(_, group1) // :id id
    paramNames.push(group1) // 把路径参数 id 保存到数组里面
    // 返回值会替换匹配到的字符串
    // () 代表一个捕获组
    // [^\/#\?] 代表匹配任何不是 / 或 # 或 ? 的字符
    // + 一个或多个 贪婪匹配
    return "([^\/#\?]+)"
  })
  regexpSource += '$' // ^ 开头 + $ 结尾 必须整个字符串完全匹配
  console.log(regexpSource) // ^/post/([^/#?]+)$
  let matcher = new RegExp(regexpSource) // /^\/post\/([^/#?]+)$/
  return [matcher, paramNames] // /^\/post\/([^/#?]+)$/ [ 'id' ]
}


let [matcher, paramNames] = compilePath('/post/:id')
console.log(matcher, paramNames) // /^\/post\/([^/#?]+)$/ [ 'id' ]

let result = '/post/100'.match(matcher)
console.log(result)
// [ '/post/100', '100', index: 0, input: '/post/100', groups: undefined ]

let values = result.slice(1)
console.log(values) // [100]

const params = paramNames.reduce((memo, paramName, index) => {
  memo[paramName] = values[index] // memo['id'] = '100'
  return memo
}, {})

console.log(params) // { id: '100' }
